package modelo;

import java.util.List;
import java.util.ArrayList;
import java.sql.ResultSet;
import java.util.Iterator;

public class ProductoDao 
{
	public boolean registrarProducto(Producto producto) throws Exception
	{
		ArrayList<String> tirasSQL= new ArrayList<String>();
		
		tirasSQL.add("insert into \"PRODUCTOS\" (cod_producto,nombre_corto,nombre_largo,cod_categoria,porc_ganancia,status) " +
				"values ('" + producto.getCodigo() + "','" + producto.getNombreCorto() + "','" + producto.getNombreLargo() + "','" +
				producto.getCategoria().getCodCategoria() + "'," + producto.getPorcGanancia() + ",'A')");
		
        Iterator<ProductoIngrediente> iterador= producto.getIterador();	   
		ProductoIngrediente productoIngrediente=null;
		
        while (iterador.hasNext())
        {
           productoIngrediente= iterador.next();
           
           tirasSQL.add("insert into \"PRODUCTOS_INGREDIENTES\" (cod_producto,cod_ingrediente,cantidad,status) values " + 
        		        "('" + producto.getCodigo() + "','" + productoIngrediente.getIngrediente().getCodigo() + "'," +
        		         productoIngrediente.getCantidad() + ",'A')");
        }
        
		boolean ejecutado=Conexion.ejecutarDMLTransaccion(tirasSQL);
		
		return ejecutado;
	}
	
	public boolean actualizarProducto(Producto producto) throws Exception
	{
		
		String tiraSQL= "update \"PRODUCTOS\" set nombre_corto='" + producto.getNombreCorto() + "'," +
				         "nombre_largo='" + producto.getNombreLargo() + "'," + 
				         "cod_categoria='" + producto.getCategoria().getCodCategoria() + "'," + 
				         "porc_ganancia=" + producto.getPorcGanancia() + " where cod_producto='" + 
				         producto.getCodigo() + "' and status='A'";
		
       boolean ejecutado=Conexion.ejecutarDML(tiraSQL);
		
	   return ejecutado;
		
	}
	
	public boolean eliminarProducto(Producto producto) throws Exception
	{
		ArrayList<String> tirasSQL= new ArrayList<String>();
		
		tirasSQL.add("update \"PRODUCTOS\" set status='E' where cod_producto='" + producto.getCodigo() + "'");
		
	    tirasSQL.add("update \"PRODUCTOS_INGREDIENTES\" set status='E' where cod_producto='" + producto.getCodigo() + "' and " +
	    		     "status='A'");
	     
		
		boolean ejecutado=Conexion.ejecutarDMLTransaccion(tirasSQL);
		
		return ejecutado;
	}
	
	public List<Producto> consultarProductosActivos() throws Exception
	{
		ArrayList<Producto> productos= new ArrayList<Producto>();
		
		String tiraSQL= "select * from \"PRODUCTOS\" where status='A'";
		
		ResultSet rs= Conexion.ejecutarDQL(tiraSQL);
		
		CategoriaDao categoriaDao= new CategoriaDao();
		ProductoIngredienteDao productoIngredienteDao= new ProductoIngredienteDao();
		Producto producto= null;
		
		while(rs.next())
		{
			producto= new Producto();
			
			producto.setCodigo(rs.getString("cod_producto"));
			producto.setNombreCorto(rs.getString("nombre_corto"));
			producto.setNombreLargo(rs.getString("nombre_largo"));
			producto.setPorcGanancia(rs.getFloat("porc_ganancia"));
			producto.setCategoria(categoriaDao.getCategoria(rs.getString("cod_categoria")));
			
			producto.sustituirProductosIngredientes(productoIngredienteDao.getProductosIngredientes(producto));
			
			productos.add(producto);
		}			
		
		 
		return productos;
	}
	
	public boolean consultarProducto(Producto producto) throws Exception
	{
		boolean seEncuentra= false;
		
        String tiraSQL= "select * from \"PRODUCTOS\" where cod_producto='" + producto.getCodigo() + "' and status='A'";
		
		ResultSet rs= Conexion.ejecutarDQL(tiraSQL);
		
		if (rs.next())
		{
			seEncuentra= true;
		}
		
		return seEncuentra;
		
	}
	
	public Producto obtenerProducto(String codProducto) throws Exception
	{
		Producto producto= null;
		
        String tiraSQL= "select * from \"PRODUCTOS\" where cod_producto='" + codProducto + "' and status='A'";
		
		ResultSet rs= Conexion.ejecutarDQL(tiraSQL);
		CategoriaDao categoriaDao= new CategoriaDao();
		ProductoIngredienteDao productoIngredienteDao= new ProductoIngredienteDao();
		
		if (rs.next())
		{
			producto= new Producto();
			
			producto.setCodigo(rs.getString("cod_producto"));
			producto.setNombreCorto(rs.getString("nombre_corto"));
			producto.setNombreLargo(rs.getString("nombre_largo"));
			producto.setPorcGanancia(rs.getFloat("porc_ganancia"));
			producto.setCategoria(categoriaDao.getCategoria(rs.getString("cod_categoria")));
			
			producto.sustituirProductosIngredientes(productoIngredienteDao.getProductosIngredientes(producto));
		}
		
		return producto;
		
	}
	
	public Producto obtenerProductoLigero(String codProducto) throws Exception
	{
		Producto producto= null;
		
        String tiraSQL= "select * from \"PRODUCTOS\" where cod_producto='" + codProducto + "' and status='A'";
		
		ResultSet rs= Conexion.ejecutarDQL(tiraSQL);
		CategoriaDao categoriaDao= new CategoriaDao();
		
		if (rs.next())
		{
			producto= new Producto();
			
			producto.setCodigo(rs.getString("cod_producto"));
			producto.setNombreCorto(rs.getString("nombre_corto"));
			producto.setNombreLargo(rs.getString("nombre_largo"));
			producto.setPorcGanancia(rs.getFloat("porc_ganancia"));
			producto.setCategoria(categoriaDao.getCategoria(rs.getString("cod_categoria")));
		}
		
		return producto;
		
	}
	
	public boolean activarProducto(Producto producto) throws Exception
	{
		ArrayList<String> lista= new ArrayList<String>();
        
		lista.add("update \"PRODUCTOS\" set status='A' where cod_producto='" + producto.getCodigo() + "'");
		lista.add("update \"PRODUCTOS_INGREDIENTES\" set status='A' where cod_producto='" + producto.getCodigo() + "'");
		
		boolean ejecutado=Conexion.ejecutarDMLTransaccion(lista);
		
		return ejecutado;
	}
	
	public boolean isDependiente(Producto producto) throws Exception
	{
		boolean dependiente = false;
		
		String tiraSQL= "select \"PRODUCTOS\".cod_producto from \"PRODUCTOS\",\"VENTAS_DETALLES\" " +
        "where \"PRODUCTOS\".cod_producto='" + producto.getCodigo() + 
        "' and \"PRODUCTOS\".cod_producto=\"VENTAS_DETALLES\".cod_producto and" +
        " \"PRODUCTOS\".status='A' and \"VENTAS_DETALLES\".status='A'";

		
        ResultSet rs= Conexion.ejecutarDQL(tiraSQL);

        if (rs.next())
        {	
           dependiente= true;

        }
		
		return dependiente;
	}
	
	public boolean isEliminado(Producto producto) throws Exception
	{
        boolean seEncuentra= false;
		
        String tiraSQL= "select * from \"PRODUCTOS\" where cod_producto='" + producto.getCodigo() + "' and status='E'";
		
		ResultSet rs= Conexion.ejecutarDQL(tiraSQL);
		
		if (rs.next())
		{
			seEncuentra= true;
			
			producto.setCategoria(new CategoriaDao().getCategoria(rs.getString("cod_categoria")));
			producto.setNombreCorto(rs.getString("nombre_corto"));
			producto.setNombreLargo(rs.getString("nombre_largo"));
			producto.setPorcGanancia(rs.getFloat("porc_ganancia"));
			
			producto.sustituirProductosIngredientes(new ProductoIngredienteDao().getProductosIngredientes(producto));
		}
		
		return seEncuentra;
	}
	
}
